package com.domain.tool;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Log 输出工厂
 *
 * @author LJM
 * @version 1.0
 * @date 2023/2/27
 */
public class LogOutFactory {

    /**
     * 日志输出器
     */
    private static Logger LOGGER = LoggerFactory.getLogger(LogOutFactory.class);

    /**
     * 添加非自定义的 Logger 包下的 类，达到不使用自定义的 Logger
     * <p>
     * 达到转而使用 RootLogger 的目的
     *
     * @param c   类的 Class 对象
     * @param <T> 泛型
     */
    public static <T> void setClassC(Class<T> c) {
        if (c != null) {
            LOGGER = LoggerFactory.getLogger(c);
        }
    }

    /**
     * 更换 Logger，不使用自定义的 Logger
     * <p>
     * 达到转而使用 RootLogger 的目的
     *
     * @param logger Logger
     */
    public static void setLogger(Logger logger) {
        LogOutFactory.LOGGER = logger;
    }

    /**
     * 输出 日志信息（类对象版）
     *
     * @param object   类对象
     * @param logLevel 日志级别
     */
    public static void outputLog(Object object, LogLevel logLevel) {
        switch (logLevel) {
            case Trace:
                LogOutFactory.trace("追踪 消息 - {}", object);
                break;
            case Debug:
                LogOutFactory.debug("详细 消息 - {}", object);
                break;
            case Info:
                LogOutFactory.info("关键 消息 - {}", object);
                break;
            case Warn:
                LogOutFactory.warn("警告 消息 - {}", object);
                break;
            case Error:
                LogOutFactory.error("错误 消息 - {}", object);
                break;
            default:
                break;
        }
    }

    /**
     * 输出 日志信息（类对象版）
     *
     * @param msg      消息
     * @param object   类对象
     * @param logLevel 日志级别
     */
    public static void outputLog(String msg, Object object, LogLevel logLevel) {
        switch (logLevel) {
            case Trace:
                LogOutFactory.trace(msg + " - {}", object);
                break;
            case Debug:
                LogOutFactory.debug(msg + " - {}", object);
                break;
            case Info:
                LogOutFactory.info(msg + " - {}", object);
                break;
            case Warn:
                LogOutFactory.warn(msg + " - {}", object);
                break;
            case Error:
                LogOutFactory.error(msg + " - {}", object);
                break;
            default:
                break;
        }
    }

    /**
     * 输出 日志信息（信息版）
     *
     * @param message  消息
     * @param logLevel 日志级别
     */
    public static void outputLog(String message, LogLevel logLevel) {
        switch (logLevel) {
            case Trace:
                LogOutFactory.trace("追踪 消息 - { " + message + " }");
                break;
            case Debug:
                LogOutFactory.debug("详细 消息 - { " + message + " }");
                break;
            case Info:
                LogOutFactory.info("关键 消息 - { " + message + " }");
                break;
            case Warn:
                LogOutFactory.warn("警告 消息 - { " + message + " }");
                break;
            case Error:
                LogOutFactory.error("错误 消息 - { " + message + " }");
                break;
            default:
                break;
        }
    }

    /**
     * 输出 追踪 消息
     *
     * @param msg 信息
     */
    public static void trace(String msg) {
        LOGGER.trace(msg);
    }

    /**
     * 输出 追踪 消息
     *
     * @param msg 信息
     * @param o   类对象
     */
    public static void trace(String msg, Object o) {
        LOGGER.trace(msg, o);
    }

    /**
     * 输出 详细、调试 消息
     *
     * @param msg 信息
     */
    public static void debug(String msg) {
        LOGGER.debug(msg);
    }

    /**
     * 输出 详细、调试 消息
     *
     * @param msg 信息
     * @param o   类对象
     */
    public static void debug(String msg, Object o) {
        LOGGER.debug(msg, o);
    }

    /**
     * 输出 关键 消息
     *
     * @param msg 信息
     */
    public static void info(String msg) {
        LOGGER.info(msg);
    }

    /**
     * 输出 关键 消息
     *
     * @param msg 信息
     * @param o   类对象
     */
    public static void info(String msg, Object o) {
        LOGGER.info(msg, o);
    }

    /**
     * 输出 警告 消息
     *
     * @param msg 信息
     */
    public static void warn(String msg) {
        LOGGER.warn(msg);
    }

    /**
     * 输出 警告 消息
     *
     * @param msg 信息
     * @param o   类对象
     */
    public static void warn(String msg, Object o) {
        LOGGER.warn(msg, o);
    }

    /**
     * 输出 错误 消息
     *
     * @param msg 信息
     */
    public static void error(String msg) {
        LOGGER.error(msg);
    }

    /**
     * 输出 错误 消息
     *
     * @param msg 信息
     * @param o   类对象
     */
    public static void error(String msg, Object o) {
        LOGGER.error(msg, o);
    }


    /**
     * Log 级别 枚举
     */
    public enum LogLevel {
        /**
         * 追踪
         */
        Trace,
        /**
         * 调试、详细
         */
        Debug,
        /**
         * 关键、消息
         */
        Info,
        /**
         * 警告
         */
        Warn,
        /**
         * 错误
         */
        Error
    }

}
